package com.example.demokotlin

import org.junit.Test

/**
 * 函数测试
 *
 * @author zhouronghua
 * @time 2021/10/14 7:31 下午
 */
class FunctionTest {

    /**
     * 测试无返回函数类型
     * doWork的返回值是Unit
     */
    @Test
    fun testUnitFunction() {
        val result = doWork()
        println("结果是$result")
        println("==测试方法默认参数值===")
        doLogin(result = { msg, code ->
            println("登录结果 msg:$msg code: $code")
        })
        // 使用方法二：通过尾随函数替代匿名函数对象
        doLogin { msg, code ->
            println("尾随函数登录结果 msg:$msg code: $code")
        }
        // 测试具名参数调用
        println("==测试方法具名参数调用===")
        doRegister(userName = "东东", age = 18, passwd = "afdg")
        println("==测试反引号函数===")
        `反引号函数`(100)
    }

    /**
     * Unit默认可以不写，代表无返回的忽略类型 == Unit类型类 Object对象
     *
     */
    fun doWork(): Unit {
        println("doWork的返回值是Unit")
    }

    /**
     * 测试具有默认值的方法
     * 说明：函数作为参数或者返回值称为高阶函数
     */
    fun doLogin(
        userName: String = "张三",
        passwd: String = "123456",
        age: Int = 25,
        result: (msg: String, code: Int) -> Unit
    ) {
        println("doLogin $userName $passwd $age")
        val str = "userName: $userName passwd $passwd 登录成功"
        result(str, 200)
    }

    /**
     * 测试具名参数方法调用
     *
     */
    fun doRegister(userName: String?, passwd: String?, age: Int?) {
        println("doRegister $userName $passwd $age")
    }

    /**
     * 反引号使用场景：
     * 1）Java中的关键字函数可以采用反引号标记
     * 2）用户自定义的特殊名称的函数
     * 3）
     *
     */
    fun `反引号函数`(num: Int) {
        println("输入内容$num")
    }
}